import { EventSubscription } from 'react-native';
import { Device, PlaybackStatus, PermissionCheckResult, PermissionRequestOptions, PermissionInfoResult, PermanentlyDeniedPermissions } from './types';
import { DlnaPlayerEventType } from './events';
import { PermissionType, PermissionStatus, PermissionStatusEventData } from './permissions';

/**
 * DLNA播放器接口
 */
export interface DlnaPlayerInterface {
  /**
   * 搜索设备
   * @returns Promise<Device[]> 设备列表
   * @throws {DlnaError} 带有错误码DlnaErrorCode.NETWORK_ERROR - 网络错误
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 权限错误
   * @throws {DlnaError} 带有错误码DlnaErrorCode.METHOD_NOT_IMPLEMENTED - 方法未实现
   */
  searchDevices(): Promise<Device[]>;

  /**
   * 增量搜索设备
   * 返回缓存设备并立即开始搜索，通过deviceFound事件通知发现的新设备
   * @param options 搜索选项
   * @param options.timeout 搜索超时时间（毫秒），默认10000ms
   * @param options.useCached 是否使用缓存设备，默认true
   * @param options.clearCache 是否清除现有缓存，默认false
   * @returns Promise<Device[]> 缓存的设备列表
   * @throws {DlnaError} 带有错误码DlnaErrorCode.NETWORK_ERROR - 网络错误
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 权限错误
   * @throws {DlnaError} 带有错误码DlnaErrorCode.METHOD_NOT_IMPLEMENTED - 方法未实现
   */
  searchDevicesIncremental(options?: {
    timeout?: number;
    useCached?: boolean;
    clearCache?: boolean;
  }): Promise<Device[]>;

  /**
   * 停止设备搜索
   * @returns Promise<boolean> 是否停止成功
   */
  stopDeviceSearch(): Promise<boolean>;

  /**
   * 添加设备发现监听器
   * @param listener 设备发现回调函数
   * @returns EventSubscription 事件订阅对象，用于取消监听
   */
  addDeviceFoundListener(listener: (device: Device) => void): EventSubscription;

  /**
   * 添加设备丢失监听器
   * @param listener 设备丢失回调函数
   * @returns EventSubscription 事件订阅对象，用于取消监听
   */
  addDeviceLostListener(listener: (device: Device) => void): EventSubscription;

  /**
   * 连接设备
   * @param deviceId 设备ID
   * @returns Promise<boolean> 是否连接成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 设备未找到
   * @throws {DlnaError} 带有错误码DlnaErrorCode.CONNECTION_FAILED - 连接失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.INVALID_PARAMETER - 无效的设备ID
   */
  connectToDevice(deviceId: string): Promise<boolean>;

  /**
   * 断开设备连接
   * @returns Promise<boolean> 是否断开成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DISCONNECTION_FAILED - 断开连接失败
   */
  disconnectFromDevice(): Promise<boolean>;

  /**
   * 播放视频
   * @param url 视频URL
   * @param title 视频标题
   * @param subtitle 视频副标题
   * @param coverUrl 封面URL
   * @returns Promise<boolean> 是否播放成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PLAYBACK_FAILED - 播放失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.INVALID_PARAMETER - 无效的URL
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  playVideo(
    url: string,
    title?: string,
    subtitle?: string,
    coverUrl?: string
  ): Promise<boolean>;

  /**
   * 暂停播放
   * @returns Promise<boolean> 是否暂停成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PAUSE_FAILED - 暂停失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  pauseVideo(): Promise<boolean>;

  /**
   * 恢复播放
   * @returns Promise<boolean> 是否恢复成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.RESUME_FAILED - 恢复失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  resumeVideo(): Promise<boolean>;

  /**
   * 停止播放
   * @returns Promise<boolean> 是否停止成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.STOP_FAILED - 停止失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  stopVideo(): Promise<boolean>;

  /**
   * 跳转到指定位置
   * @param position 位置（秒）
   * @returns Promise<boolean> 是否跳转成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.SEEK_FAILED - 跳转失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.INVALID_PARAMETER - 位置参数无效
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  seekTo(position: number): Promise<boolean>;

  /**
   * 获取播放状态
   * @returns Promise<PlaybackStatus> 播放状态
   * @throws {DlnaError} 带有错误码DlnaErrorCode.GET_STATUS_FAILED - 获取状态失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  getPlaybackStatus(): Promise<PlaybackStatus>;

  /**
   * 设置音量
   * @param volume 音量（0-100）
   * @returns Promise<boolean> 是否设置成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.VOLUME_CONTROL_FAILED - 音量控制失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.INVALID_PARAMETER - 音量参数无效
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  setVolume(volume: number): Promise<boolean>;

  /**
   * 获取音量
   * @returns Promise<number> 音量（0-100）
   * @throws {DlnaError} 带有错误码DlnaErrorCode.VOLUME_CONTROL_FAILED - 获取音量失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  getVolume(): Promise<number>;

  /**
   * 设置静音
   * @param mute 是否静音
   * @returns Promise<boolean> 是否设置成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.VOLUME_CONTROL_FAILED - 设置静音失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  setMute(mute: boolean): Promise<boolean>;

  /**
   * 获取静音状态
   * @returns Promise<boolean> 是否静音
   * @throws {DlnaError} 带有错误码DlnaErrorCode.VOLUME_CONTROL_FAILED - 获取静音状态失败
   * @throws {DlnaError} 带有错误码DlnaErrorCode.DEVICE_NOT_FOUND - 未连接设备
   */
  getMute(): Promise<boolean>;
  
  /**
   * 添加事件监听器
   * @param eventType 事件类型
   * @param listener 监听器回调
   * @returns EventSubscription 事件订阅对象，用于移除监听器
   */
  addEventListener(
    eventType: DlnaPlayerEventType,
    listener: (event: any) => void
  ): EventSubscription;
  
  /**
   * 移除事件监听器
   * @param subscription 事件订阅对象
   */
  removeEventListener(
    subscription: EventSubscription
  ): void;

  /**
   * 检查是否拥有所需权限
   * @returns Promise<PermissionCheckResult> 权限检查结果
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 权限检查出错
   */
  checkPermissions(): Promise<PermissionCheckResult>;

  /**
   * 请求所需的权限
   * @param options 权限请求选项
   * @returns Promise<boolean> 是否获得了所有权限
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 请求权限出错
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_PERMANENTLY_DENIED - 权限被永久拒绝
   */
  requestPermissions(options?: PermissionRequestOptions): Promise<boolean>;
  
  /**
   * 检查单个权限状态
   * @param permissionType 权限类型
   * @returns Promise<PermissionStatus> 权限状态
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 权限检查出错
   */
  checkSinglePermission(permissionType: PermissionType): Promise<PermissionStatus>;
  
  /**
   * 添加权限状态变更监听器
   * @param listener 监听器回调
   * @returns EventSubscription 事件订阅对象
   */
  addPermissionStatusChangeListener(
    listener: (event: PermissionStatusEventData) => void
  ): EventSubscription;
  
  /**
   * 移除权限状态变更监听器
   * @param subscription 事件订阅对象
   */
  removePermissionStatusChangeListener(subscription: EventSubscription): void;
  
  /**
   * 获取所需的权限信息列表
   * @returns Promise<PermissionInfoResult[]> 权限信息列表
   */
  getRequiredPermissions(): Promise<PermissionInfoResult[]>;
  
  /**
   * 检查是否有永久拒绝的权限
   * @returns Promise<PermanentlyDeniedPermissions> 永久拒绝的权限信息
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 权限检查出错
   */
  checkPermanentlyDeniedPermissions(): Promise<PermanentlyDeniedPermissions>;
  
  /**
   * 重置权限请求历史记录
   * 用于测试或需要强制重新请求权限的情况
   */
  resetPermissionRequestHistory(): void;
  
  /**
   * 添加事件监听器（简化版API，为了向后兼容）
   * @param eventName 事件名称
   * @param listener 监听器回调
   * @returns EventSubscription 事件订阅对象
   */
  addListener(
    eventName: string,
    listener: (event: any) => void
  ): EventSubscription;

  /**
   * 开始搜索设备
   * @returns Promise<boolean> 是否开始搜索成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.NETWORK_ERROR - 网络错误
   * @throws {DlnaError} 带有错误码DlnaErrorCode.PERMISSION_ERROR - 权限错误
   * @throws {DlnaError} 带有错误码DlnaErrorCode.METHOD_NOT_IMPLEMENTED - 方法未实现
   */
  startScan(): Promise<boolean>;

  /**
   * 停止搜索设备
   * @returns Promise<boolean> 是否停止搜索成功
   * @throws {DlnaError} 带有错误码DlnaErrorCode.METHOD_NOT_IMPLEMENTED - 方法未实现
   */
  stopScan(): Promise<boolean>;
} 